#!/bin/bash

# 设置错误时退出
set -e

# 颜色定义
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
RED='\033[0;31m'
NC='\033[0m' # No Color

# 日志输出函数
log_info() {
  echo -e "${BLUE}[信息] $1${NC}"
}

log_success() {
  echo -e "${GREEN}[成功] $1${NC}"
}

log_warning() {
  echo -e "${YELLOW}[警告] $1${NC}"
}

log_error() {
  echo -e "${RED}[错误] $1${NC}"
}

# 获取脚本目录的绝对路径
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"

# 确保所有脚本可执行
chmod +x "$SCRIPT_DIR"/*.sh

# 显示主菜单
show_menu() {
  clear
  echo -e "${BLUE}===== 开发环境设置 =====${NC}"
  echo -e "${YELLOW}1. 设置配置文件 (链接 mac_env.zsh 到用户目录)${NC}"
  echo -e "${YELLOW}2. 管理 Node.js 环境${NC}"
  echo -e "${YELLOW}3. 修复 npm 权限问题${NC}"
  echo -e "${YELLOW}4. 检查当前环境${NC}"
  echo -e "${YELLOW}0. 退出${NC}"
  echo
  echo -n "请输入选择 [0-4]: "
}

# Node.js 环境管理菜单
show_node_menu() {
  clear
  echo -e "${BLUE}===== Node.js 环境管理 =====${NC}"
  echo -e "${YELLOW}1. 安装/更新 n 版本管理器${NC}"
  echo -e "${YELLOW}2. 按当前版本安装全局工具包${NC}"
  echo -e "${YELLOW}3. 安装 Legacy 环境全局包 (Node.js 14 及以下)${NC}"
  echo -e "${YELLOW}4. 安装 Middle 环境全局包 (Node.js 15-19)${NC}"
  echo -e "${YELLOW}5. 安装 Modern 环境全局包 (Node.js 20+)${NC}"
  echo -e "${YELLOW}6. 显示全局包目录信息${NC}"
  echo -e "${YELLOW}7. 清理指定分组的全局包${NC}"
  echo -e "${YELLOW}0. 返回主菜单${NC}"
  echo
  echo -n "请输入选择 [0-7]: "
}

# 显示全局包目录信息
show_global_info() {
  log_info "显示全局包目录信息..."
  if command -v node-global >/dev/null 2>&1; then
    node-global
  else
    echo -e "${RED}未找到 node-global 命令${NC}"
    echo -e "${YELLOW}请确保 mac_env.zsh 已加载${NC}"
  fi
}

# 清理指定分组的全局包
clean_global_group() {
  echo -n "请输入要清理的分组名称 (legacy/middle/modern): "
  read group
  
  case "$group" in
    legacy|middle|modern)
      log_info "清理 $group 分组的全局包目录..."
      clean-node-global "$group"
      ;;
    *)
      log_error "无效的分组名称: $group"
      log_info "有效的分组名称: legacy (Node.js 14及以下), middle (Node.js 15-19), modern (Node.js 20+)"
      ;;
  esac
}

# 安装 n 版本管理器
install_n() {
  log_info "安装 n 版本管理器..."
  
  # 创建 .n 目录
  mkdir -p "$HOME/.n/bin"
  
  # 下载 n
  curl -L https://raw.githubusercontent.com/tj/n/master/bin/n -o "$HOME/.n/bin/n"
  chmod +x "$HOME/.n/bin/n"
  
  log_success "n 版本管理器安装完成"
  log_info "请确保 N_PREFIX 环境变量已设置为 $HOME/.n"
  log_info "并确保 $HOME/.n/bin 在您的 PATH 环境变量中"
}

# 检查当前环境
check_env() {
  log_info "检查当前环境..."
  
  # 检查目录
  echo -e "目录状态:"
  
  # 检查 n 目录
  if [ -d "$HOME/.n" ]; then
    echo -e "  ${GREEN}✓ $HOME/.n 存在${NC}"
  else
    echo -e "  ${RED}✗ $HOME/.n 不存在${NC}"
  fi
  
  # 检查 Node.js 全局包根目录
  if [ -d "$HOME/.node_global" ]; then
    echo -e "  ${GREEN}✓ $HOME/.node_global 存在${NC}"
    
    # 检查分组目录
    for group in "legacy" "middle" "modern"; do
      if [ -d "$HOME/.node_global/$group" ]; then
        echo -e "    ${GREEN}✓ $group 分组目录存在${NC}"
      else
        echo -e "    ${RED}✗ $group 分组目录不存在${NC}"
      fi
    done
  else
    echo -e "  ${RED}✗ $HOME/.node_global 不存在${NC}"
  fi
  
  # 检查配置文件
  echo -e "\n配置文件状态:"
  if [ -L "$HOME/.mac_env.zsh" ]; then
    echo -e "  ${GREEN}✓ ~/.mac_env.zsh 是符号链接${NC}"
    ls -l "$HOME/.mac_env.zsh"
  elif [ -f "$HOME/.mac_env.zsh" ]; then
    echo -e "  ${YELLOW}! ~/.mac_env.zsh 是普通文件 (应该是符号链接)${NC}"
  else
    echo -e "  ${RED}✗ ~/.mac_env.zsh 不存在${NC}"
  fi
  
  if grep -q "source ~/.mac_env.zsh" "$HOME/.zshrc" 2>/dev/null; then
    echo -e "  ${GREEN}✓ ~/.zshrc 包含对 mac_env.zsh 的引用${NC}"
  else
    echo -e "  ${RED}✗ ~/.zshrc 不包含对 mac_env.zsh 的引用${NC}"
  fi
  
  # 检查软件
  echo -e "\n软件状态:"
  if command -v node >/dev/null 2>&1; then
    local node_version=$(node -v)
    echo -e "  ${GREEN}✓ Node.js 已安装: $node_version${NC}"
    echo -e "    路径: $(which node)"
    
    # 检测版本分组
    local major_version=$(echo $node_version | cut -d 'v' -f2 | cut -d '.' -f1)
    local group=""
    
    if [ "$major_version" -le 14 ]; then
      group="legacy"
    elif [ "$major_version" -le 19 ]; then
      group="middle"
    else
      group="modern"
    fi
    
    echo -e "    版本分组: $group"
  else
    echo -e "  ${RED}✗ Node.js 未安装${NC}"
  fi
  
  if command -v npm >/dev/null 2>&1; then
    echo -e "  ${GREEN}✓ npm 已安装: $(npm -v)${NC}"
    echo -e "    路径: $(which npm)"
    echo -e "    全局目录: $(npm config get prefix)"
  else
    echo -e "  ${RED}✗ npm 未安装${NC}"
  fi
  
  if command -v pnpm >/dev/null 2>&1; then
    echo -e "  ${GREEN}✓ pnpm 已安装: $(pnpm -v)${NC}"
    echo -e "    路径: $(which pnpm)"
    echo -e "    PNPM_HOME: $PNPM_HOME"
  else
    echo -e "  ${RED}✗ pnpm 未安装${NC}"
  fi
  
  if command -v n >/dev/null 2>&1; then
    echo -e "  ${GREEN}✓ n 已安装: $(n --version)${NC}"
    echo -e "    路径: $(which n)"
    echo -e "    N_PREFIX: $N_PREFIX"
  else
    echo -e "  ${RED}✗ n 未安装${NC}"
  fi
  
  # 检查环境变量
  echo -e "\n环境变量状态:"
  echo -e "  NODE_GLOBAL_ROOT: ${NODE_GLOBAL_ROOT:-未设置}"
  echo -e "  NPM_CONFIG_PREFIX: ${NPM_CONFIG_PREFIX:-未设置}"
  echo -e "  PNPM_HOME: ${PNPM_HOME:-未设置}"
  echo -e "  N_PREFIX: ${N_PREFIX:-未设置}"
  
  echo
  log_success "环境检查完成"
}

# 主函数
main() {
  while true; do
    show_menu
    read choice
    
    case "$choice" in
      1)
        "$SCRIPT_DIR/setup_config.sh"
        ;;
      2)
        # Node.js 环境管理子菜单
        while true; do
          show_node_menu
          read node_choice
          
          case "$node_choice" in
            1)
              install_n
              ;;
            2)
              "$SCRIPT_DIR/setup_node_env.sh"
              ;;
            3)
              "$SCRIPT_DIR/setup_node_legacy.sh"
              ;;
            4)
              "$SCRIPT_DIR/setup_node_middle.sh"
              ;;
            5)
              "$SCRIPT_DIR/setup_node_modern.sh"
              ;;
            6)
              show_global_info
              ;;
            7)
              clean_global_group
              ;;
            0)
              break
              ;;
            *)
              log_error "无效的选择"
              ;;
          esac
          
          echo
          echo -n "按 Enter 键继续..."
          read dummy
        done
        ;;
      3)
        "$SCRIPT_DIR/fix_npm_permissions.sh"
        ;;
      4)
        check_env
        ;;
      0)
        log_info "退出程序"
        exit 0
        ;;
      *)
        log_error "无效的选择"
        ;;
    esac
    
    echo
    echo -n "按 Enter 键继续..."
    read dummy
  done
}

# 运行主函数
main "$@" 